package com.originalpoint.origin_server.controller;

import com.originalpoint.origin_server.pojo.*;
import com.originalpoint.origin_server.result.Result;
import com.originalpoint.origin_server.service.UserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;

/**
 *
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

//    Double price = null;
//    Integer quantityOrdered = null;

//    订单插入:
//    1.通过三个id字段、指定orders表的o_userId(set),o_merId(set),o_addressId(根据String反查之后set)字段
//    2.通过OrderDish实体类获得dishID和quantityOrdered字段,dishID直接指定dish表的dishId，随后通过此id查得dishPrice
        //    3.将2中得到的quantityOrdered字段和dishPrice字段交由UserASpect切面类，完成totalPrice的计算,
        //      这里的参数传递交由Service层的方法sendParam完成
//    3.改:直接在此页面计算
//    4.指定一个瞬时时间currentTime，值为调用该处理器的时间
//    5.指定订单的三个id
//    6.循环取出每一个请求对象，完成
//      6.1价格的循环累加
//      6.2order_dish表dishID、quantityOrdered和time(=currentTime)字段的循环插入
//      6.3单个菜品数量的同步更新（菜品剩余数量跟下单数量的校验在前端完成）
//    7.指定订单所有菜品的总价totalPrice，完成订单的插入
//    8.最后查得插入订单的orderId，根据time字段完成orderID字段的插入
//    7.4log：需要做一个list，用于接收数组对象[{},{},{}],循环取出每个数据执行查询逻辑，随后将所有的金额加起来

    @ApiOperation(value  = "插入订单信息")
    @PostMapping("/insertOrders")
    public Result insertOrders(@RequestBody UserOrderDatas userOrderDatas){
//        查看前端传递的参数格式
//        System.out.println(userOrderDatas.getUserOrders().get(0));
        //准备工作
        Orders orders = new Orders();
        Dish dish = new Dish();
        OrderDish orderDish = new OrderDish();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//Date格式化
        String currentTime = dateFormat.format(new Date());//修改order_dish表的依据
        double moneyNeeds = 0;
        //因为一个订单的userId，merId，Address是一样的，仅菜品单价和下单数目不同，
        //所以单独取一个userOrderData规定相同的字段给orders即可
        UserOrderData firstUserOrderData = userOrderDatas.getUserOrders().get(0);
//        订单插入
        //相同内容指定
            //直接指定o_userId、o_merId和time字段
        orders.setO_userId(firstUserOrderData.getUserId());
        orders.setO_merId(firstUserOrderData.getMerId());
        orders.setTime(currentTime);
            //调用方法反查AddressId并指定给o_addressId
        Integer addr = userService.getAddr(firstUserOrderData.getAddress());
        orders.setO_addressId(addr);
        //价格累加，三字段插入，菜品剩余数量同步更新
        ListIterator<UserOrderData> interator = userOrderDatas.getUserOrders().listIterator();
        while (interator.hasNext()){//循环取出每一个菜品，进行价格累加、order_dish表三字段的循环插入
            //System.out.println(interator.next()+"-------");
            UserOrderData data = interator.next();
            //插入order_dish三字段
                //获取前端传过来OrderDish对象的参数
            Integer quantity = data.getOrderDish().getQuantityOrdered();
            Integer dish_id = data.getOrderDish().getDishID();
                //采用set为全局orderDish对象赋值而不用其有参构造：避免多次创造对象造成的内存冗余
            orderDish.setDishID(dish_id);
            orderDish.setQuantityOrdered(quantity);
            orderDish.setTime(currentTime);
                //插入三字段
            userService.insertThree(orderDish);
            //通过dishID调用方法获取菜品单价--由于dishID和dishId是一一对应的，所以直接用dishID即可查询
            Double price = userService.getDishInfo(dish_id).getDishPrice();
            //获取菜品剩余数量
            Integer quantity_left = userService.getDishInfo(dish_id).getQuantityLeft();
//            System.out.println("查得菜品"+dish_id+"单价："+price);
//            System.out.println("查得菜品"+dish_id+"下单数量："+quantity);
//            System.out.println("查得菜品"+dish_id+"剩余数量："+quantity_left);
//            System.out.println("------------------");
//            if(quantity<=quantity_left) {//菜品剩余数量足够--在前端完成校验
//                //价格累加
//                MoneyNeeds += (price * quantity);
//                //单个菜品数量减少
//                userService.updateQuantityLeft(quantity_left-quantity);
//            }
            //价格累加
            moneyNeeds += (price * quantity);
            //单个菜品数量减少
            userService.updateQuantityLeft(quantity_left-quantity,dish_id);
        }
//        System.out.println("订单总价为:"+moneyNeeds);
        //为orders指定最后一个字段totalPrice
        orders.setTotalPrice(moneyNeeds);
//        订单插入
        userService.insertOrders(orders);
//        特定订单查询
        Integer queryOrderId = userService.queryOrderId(currentTime);
//        插入order_dish最后一个字段
        userService.setodOrderID(queryOrderId,currentTime);

        return Result.BuildSuccess();

    }

//    用户订单查询
@ApiOperation(value  = "用户订单查询")
    @GetMapping("/queryOrders")
    public Result queryOrders(Integer userId){
        //调用方法查询订单数据:orderId,time,`status`,merName,merImg,region,street,detailAddress
        List<Orders> orders = userService.queryOrders(userId);
        //返回数据
        return Result.BuildSuccess(orders);
    }

//    用户信息查询
@ApiOperation(value  = "用户信息查询")
    @GetMapping("/queryUserInfo")
    public Result queryUserInfo(Integer userId){

        User user = userService.queryUserInfo(userId);

        return Result.BuildSuccess(user);
    }

//    用户信息修改：包含地址插入和信息修改，
//    因为一用户登录进去只有userId,userName,userPassword,userImg四个字段，是没有地址的，所以要加
//    修改界面：前端传过来的字段：
//          userId,userName,userPassword,userImg(user)  u_addressId初始为null，user和address还未关联
//          region,street,detailAddress(user.address)
//    1.先查询用户信息queryUserInfo,得到u_addressId,判断是否为空
//    2.为空则只执行插入地址操作setAddr,随后通过插入的地址反查getAddr得到addressId，将其赋予u_addressId，随后调用用户信息修改方法
//    3.不为空则直接调用用户信息修改方法
@ApiOperation(value  = "更新用户信息")
    @PutMapping("/updateUserInfo")
    public Result updateUserInfo(@RequestBody User user){
//        为user设置u_addressId关联一个地址
//        System.out.println("得到的用户id:"+user.getUserId());//无误
        User userInfo = userService.queryUserInfo(user.getUserId());
        Integer addrId = userInfo.getU_addressId();
//        System.out.println("修改前的addrId："+addrId);
        //addrId为空先搜寻地址信息，无再插入地址信息(multiaddress)、u_addressId(user)
        if(addrId==null){//用户还未指定地址
            Integer addr = userService.getAddr(user.getAddress());
            if(addr!=null){//有该地址信息，直接指定u_addressId
                addrId=addr;
                user.setU_addressId(addrId);
            }else{//无该地址信息
                //插入地址
                userService.setAddr(user.getAddress());
                //为addrId赋值
                addrId = userService.getAddr(user.getAddress());
//            System.out.println("修改后的addrId："+addrId);
                user.setU_addressId(addrId);
            }
        }
        //存入u_addressId，单独将两个需要的数据提出来传递，降低数据冗余
        userService.insertAddr(addrId, user.getUserId());
        //修改用户信息
        userService.updateUserInfo(user);

        return Result.BuildSuccess();
    }

//列表渲染，在初始化页面时调用
    //获得所有商家信息
@ApiOperation(value  = "列表渲染，在初始化页面时调用")
    @GetMapping("/getAllMerchats")
    public Result getAllMerchats(){
        List<Merchat> merchatList = userService.getAllMerchats();
        return Result.BuildSuccess(merchatList);
    }
    //根据商户Id获得菜品信息
    @ApiOperation(value  = "根据商户Id获得菜品信息")
    @GetMapping("/getAllDishes")
    public Result getAllDishes(Integer merId){
        List<Dish> dishList = userService.getAllDishes(merId);
        return Result.BuildSuccess(dishList);
    }

}
